package com.cn.bulu.utils.interceptorUtils;

import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.cn.bulu.utils.MD5Utils.MD5Utils;
import com.cn.bulu.utils.redis.JedisUtil;

/**
 * 登录拦截器
 * 
 * @author wyw
 *
 */
public class TokenInterceptor extends HandlerInterceptorAdapter {
	// 这个方法在业务处理器处理请求之前被调用
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 获取所有的请求参数, 如果参数中没有timestamp, sign, token,就拦截
		Integer reqPara = 0;
		Enumeration<String> parameterNames = request.getParameterNames();
		while (parameterNames.hasMoreElements()) {
			String string = (String) parameterNames.nextElement();
			if (string.equals("timestamp")) {
				reqPara++;
			}
			if (string.equals("token")) {
				reqPara++;
			}
			if (string.equals("sign")) {
				reqPara++;
			}

		}
		if (reqPara == 3) {
			// 判断当前时间戳与现在时间戳相差多久
			String times = request.getParameter("timestamp");
			Long s = (System.currentTimeMillis() - Long.parseLong(times)) / (1000 * 60);
			if (s < 1) {
				// 判断令牌是否正确
				StringBuffer buffer = new StringBuffer();
				buffer.append(times);
				buffer.append("wo!SH>.iCh@a#?oJ**iAPP(");
				String token = MD5Utils.MD5(buffer.toString());
				if (request.getParameter("token").equals(token)) {
					// 通过狗蛋, 还要登录验证 什么鬼
					// 从缓存中获取登录的sign
					String dengluKey = request.getParameter("sign");
					String string = JedisUtil.getSessionIDForApp(dengluKey,7);
					if (string != null && string.length() > 0) {
						return true;
					} else {
						response.sendRedirect("../interceptor/login");
						return false;
					}
				} else {
					// 令牌不正确
					response.sendRedirect("../interceptor/failreToken");
					return false;
				}

			} else {
				// 请求过期
				response.sendRedirect("../interceptor/overTime");
				return false;
			}
		} else {
			// 请求参数没有这几个参数
			response.sendRedirect("../interceptor/paramter");
			return false;
		}

	}

	// 这个方法在业务处理器处理完请求后，但是DispatcherServlet向客户端返回请求前被调用，在该方法中对用户请求request进行处理。
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// Auto-generated method stub
		super.postHandle(request, response, handler, modelAndView);
	}

	// 这个方法在DispatcherServlet完全处理完请求后被调用，可以在该方法中进行一些资源清理的操作。
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// Auto-generated method stub
		super.afterCompletion(request, response, handler, ex);
	}

}
